// 存放程序的配置信息
package config

import (
	"fmt"
	"path"
	"project/utils/logs"
	"runtime"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

const (
	TimeFormat string = "2024-01-01 12:01:01"
)

var (
	Port       string
	JwtSignKey string
	JwtExpTime int64 // jwt token过期时间，单位：分钟
	Username   string
	Password   string
)

// 封装和规范数据
type ReturnData struct {
	Status  int                    `json:"status"`
	Message string                 `json:"message"`
	Data    map[string]interface{} `json:"data"`
}

// 构造函数 ，结构体本身是不能设置默认值的，构造函数是结构体的一个方法
func NewReturnData() ReturnData {
	returnData := ReturnData{}
	returnData.Status = 200
	returnData.Message = ""
	data := make(map[string]interface{})
	returnData.Data = data
	return returnData
}

func initLogConfig(logLevel string) {
	// 配置程序的日志输出级别
	if logLevel == "debug" {
		logrus.SetLevel(logrus.DebugLevel)
	} else {
		logrus.SetLevel(logrus.InfoLevel)
	}
	// 文件名和行号
	logrus.SetReportCaller(true)
	// 日志格式改成json
	logrus.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: TimeFormat,
		// runtime.Frame: 帧，可用于获取调用者返回的PC值的函数，文件或者是行信息。 （PC值-当前方法的内存地址，可以通过这个获取哪个方法、哪一行执行的）
		CallerPrettyfier: func(f *runtime.Frame) (function string, file string) {
			// 获取函数名，文件名
			fileName := path.Base(f.File)
			return f.Function, fileName
		},
	})
}

func init() {
	// logs.Debug(nil, "开始加载程序配置")
	logs.Info(nil, "开始加载程序配置")

	// 环境变量加载我们程序配置，如windows环境变量，mac ~/.zshrc
	viper.SetDefault("LOG_LEVEL", "debug")
	viper.SetDefault("PORT", ":8081")
	// 获取jwt加密的secret
	viper.SetDefault("JWT_SIGN_KEY", "hwb_jwt_secret")
	// 获取jwt过期时间的配置
	viper.SetDefault("JWT_EXP_TIME", "60")
	// 配置用户名密码的默认值   md5
	// 默认值：kolor  hwb123_password
	viper.SetDefault("USERNAME", "49d3efb25d738819acebadae46ba6901")
	viper.SetDefault("PASSWORD", "e6dd626e7b12379341bde0a0c0f43bf2")

	// 自动将配置文件中的环境变量名称转换为大写形式
	viper.AutomaticEnv()
	logLevel := viper.GetString("LOG_LEVEL") // 获取程序配置
	Port = viper.GetString("PORT")
	JwtSignKey = viper.GetString("JWT_SIGN_KEY")
	JwtExpTime = viper.GetInt64("JWT_EXP_TIME")
	Username = viper.GetString("USERNAME")
	Password = viper.GetString("PASSWORD")
	logs.Info(map[string]interface{}{"用户名": Username, "密码": Password}, "获取到程序用户名密码")

	// 加载日志格式
	initLogConfig(logLevel)
	fmt.Println("config端口:", Port, JwtExpTime, JwtSignKey, Username, Password)
}
